﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using Proxy;
using System.Web.Services;
using System.Text;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmBlendingRegistro : PageBase
    {
        List<listarBlendingMuestra_Result> listaMuestra = new List<listarBlendingMuestra_Result>();
        List<ListarBlendingResultado_Result> listaMuestraResultado = new List<ListarBlendingResultado_Result>();
        List<ListItemInt> listaPlataforma = new List<ListItemInt>();

        #region SESSIONES
        private const string SESSION_MUESTRA = "Muestra";
        private const string SESSION_RESULTADO = "Resultado";
        private const string SESSION_PLATAFORMA = "Plataforma";
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string id = Request.Params["id"].ToString();
                string accion = Request.Params["acc"].ToString();
                string anio = Request.Params["an"].ToString();

                this.hidCodigo.Value = id;
                this.hidAccion.Value = accion;
                this.hidAnio.Value = anio;
                LimpiarDetalles();

                CargarCombos();
                CargarPlataforma();

                #region CargarDetalle
                if (accion.CompareTo(enmAccionRealizar.Nuevo.GetHashCode().ToString()) == 0)
                {
                    MostrarDetalle(id, enmAccionRealizar.Nuevo);
                }
                else if (accion.CompareTo(enmAccionRealizar.Edicion.GetHashCode().ToString()) == 0)
                {
                    MostrarDetalle(id, enmAccionRealizar.Edicion);
                }
                else if (accion.CompareTo(enmAccionRealizar.Edicion.GetHashCode().ToString()) == 0)
                {
                    MostrarDetalle(id, enmAccionRealizar.Ver);
                }
                #endregion
            }

        }

        #region Metodos

        private void CargarPlataforma()
        {
            try
            {
                using (var proxy = new SEPlataformaClient("BasicHttpBinding_ISEPlataforma"))
                {
                    this.listaPlataforma = proxy.ObtenerListItem().ToList();
                    Session[SESSION_PLATAFORMA] = this.listaPlataforma;

                    Bind(this.ddlPlataforma, this.listaPlataforma);
                    this.ddlPlataforma.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:CargarPrograma", ex);
            }
        }

        private void ListarMuestra()
        {
            try
            {

                using (var proxy = new SEMuestraEspecialClient("BasicHttpBinding_ISEMuestraEspecial"))
                {
                    this.listaMuestra = proxy.BuscarMuestraEspecialPorCodigoGrupoMezcla(this.hidCodigo.Value).ToList();
                }
                this.rgMuestra.DataSource = this.listaMuestra;
                this.rgMuestra.DataBind();
                Session[SESSION_MUESTRA] = this.listaMuestra;
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:ListarMuestra", ex);
            }
        }

        private void ConsultaMuestra()
        {
            try
            {

                using (var proxy = new SEMuestraEspecialClient("BasicHttpBinding_ISEMuestraEspecial"))
                {
                    var lista = proxy.BuscarMuestraEspecialPorTipoCancha(int.Parse(this.ddlTipoCancha.SelectedValue), this.txtCodigoMuestraEspecial.Text.Trim()).ToList();

                    this.rgConsulta.DataSource = lista;
                    this.rgConsulta.DataBind();
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:ListarMuestra", ex);
            }
        }

        private void ListarMuestraResultado()
        {
            try
            {

                using (var proxy = new SEGrupoMezclaResultadoClient("BasicHttpBinding_ISEGrupoMezclaResultado"))
                {
                    this.listaMuestraResultado = proxy.BuscarGrupoMezclaResultado(this.hidCodigo.Value).ToList();
                }
                Session[SESSION_RESULTADO] = this.listaMuestraResultado;
                this.rgResultado.DataSource = this.listaMuestraResultado;
                this.rgResultado.DataBind();
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:ListarMuestra", ex);
            }
        }

        private void LimpiarDetalles()
        {
            Session[SESSION_MUESTRA] = null;
            Session[SESSION_RESULTADO] = null;
            Session[SESSION_PLATAFORMA] = null;
        }

        private void CargarCombos()
        {
            try
            {

                using (var proxy = new SETipoCanchaClient("BasicHttpBinding_ISETipoCancha"))
                {
                    this.Bind(this.ddlTipoCancha, proxy.ObtenerListItem().ToList());
                    this.ddlTipoCancha.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (var proxy = new SEMesClient("BasicHttpBinding_ISEMes"))
                {
                    this.Bind(this.ddlMes, proxy.ObtenerListItem().ToList());
                    this.ddlMes.SelectedValue = DateTime.Now.Month.ToString().PadLeft(2, '0');
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:CargarCombos", ex);
            }
        }

        private string GenerarCodigoGrupoMuesta()
        {
            string codigoAvance = "0";
            try
            {
                using (var proxy = new SEGrupoMezclaClient("BasicHttpBinding_ISEGrupoMezcla"))
                {
                    codigoAvance = proxy.GenerarCodigoGrupoMezcla(this.txtAnio.Text, this.ddlMes.SelectedValue.ToString());
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:GenerarCodigoAvance", ex);
            }
            return codigoAvance;

        }

        protected override void Limpiar()
        {
            this.hidCodigo.Value = "0";
            this.txtAnio.Text = DateTime.Now.Year.ToString();
            this.ddlTipoCancha.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();


            OcultarMensaje();
            OcultarMensajeValidacion();
        }

        private void Habilitar(bool estado = true)
        {
            this.txtAnio.Enabled = estado;
            this.ddlTipoCancha.Enabled = estado;
            this.txtAnio.Enabled = estado;
            this.ddlMes.Enabled = estado;
            this.txtFechaInicioCabeceo.Enabled = estado;
            this.txtFechaInicioPlanta.Enabled = estado;
            this.txtFechaFinPlanta.Enabled = estado;
            this.txtObservacion.Enabled = estado;

            this.ibtnGuardar.Visible = estado;
        }

        private void MostrarDetalle(string codigoGrupoMezcla, enmAccionRealizar accionRealizar)
        {
            try
            {
                this.hidCodigo.Value = codigoGrupoMezcla.ToString();
                if (accionRealizar == enmAccionRealizar.Edicion)
                {
                    //Carga detalla de pantalla en modo Edicion
                    this.CargarDatos(codigoGrupoMezcla);
                    Habilitar(true);
                    this.ddlTipoCancha.Enabled = false;
                    this.txtAnio.Enabled = false;
                    this.ddlMes.Enabled = false;

                    this.ddlTipoCancha.CssClass = CSS_INPUT_DISABLED;
                    this.txtAnio.CssClass = CSS_INPUT_DISABLED;
                    this.ddlMes.CssClass = CSS_INPUT_DISABLED;
                }
                else if (accionRealizar == enmAccionRealizar.Ver)
                {
                    //Carga detalla de pantalla en modo Consulta
                    this.CargarDatos(codigoGrupoMezcla);
                    Habilitar(false);
                    this.ddlTipoCancha.Enabled = false;
                    this.txtAnio.Enabled = false;
                    this.ddlMes.Enabled = false;

                    this.ddlTipoCancha.CssClass = CSS_INPUT_DISABLED;
                    this.txtAnio.CssClass = CSS_INPUT_DISABLED;
                    this.ddlMes.CssClass = CSS_INPUT_DISABLED;
                }
                else if (accionRealizar == enmAccionRealizar.Nuevo)
                {
                    //Carga detalla de pantalla en modo Nuevo
                    Limpiar();
                    this.txtCodigo.Text = GenerarCodigoGrupoMuesta();
                    Habilitar(true);
                }

                this.ListarMuestra();
                this.ListarMuestraResultado();

                //OcultarMensaje();
                OcultarMensajeValidacion();

                //this.mpRegistro.Show();
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:MostrarDetalle", ex);
            }
        }

        private void CargarDatos(string codigoGrupoMezcla)
        {
            try
            {
                using (var proxy = new SEGrupoMezclaClient("BasicHttpBinding_ISEGrupoMezcla"))
                {
                    var item = proxy.ObtenerGrupoMezcla(codigoGrupoMezcla);
                    if (item != null)
                    {
                        this.hidCodigo.Value = item.CodigoGrupoMezcla.ToString();
                        this.txtCodigo.Text = item.CodigoGrupoMezcla.ToString();
                        this.ddlTipoCancha.SelectedValue = item.CodigoTipoCancha.ToString();
                        this.txtAnio.Text = item.Anio.ToString();
                        this.ddlMes.SelectedValue = item.Mes;
                        this.txtFechaInicioCabeceo.SelectedDate = (DateTime)item.FechaInicioCabeceo;
                        if (item.FechaFinCabeceo != null) this.txtFechaInicioPlanta.SelectedDate = (DateTime)item.FechaFinCabeceo;
                        if (item.FechaInicioPlanta != null) this.txtFechaInicioPlanta.SelectedDate = (DateTime)item.FechaInicioPlanta;
                        if (item.FechaFinPlanta != null) this.txtFechaFinPlanta.SelectedDate = (DateTime)item.FechaFinPlanta;
                        this.txtObservacion.Text = item.Observacion;

                        this.hidAnio.Value = item.Anio.ToString();
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:CargarDatos", ex);
            }
        }

        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        private void MostrarMensajeValidacionResultado(string mensaje)
        {
            this.pnlMensajeRegistro.Visible = true;
            this.lblMensajeRegistro.Text = mensaje;
        }

        private void OcultarMensajeValidacionResultado()
        {
            this.pnlMensajeRegistro.Visible = false;
            this.lblMensajeRegistro.Text = string.Empty;
        }

        #endregion

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {
                this.listaMuestra = (List<listarBlendingMuestra_Result>)Session[SESSION_MUESTRA];
                if (this.listaMuestra == null || this.listaMuestra.Count == 0)
                {
                    sb.AppendLine("Debe seleccionar Muestra[s] Especial[es]. ");
                    retorno = false;
                }

                //Entubacion
                this.listaMuestraResultado = (List<ListarBlendingResultado_Result>)Session[SESSION_RESULTADO];
                if (this.listaMuestraResultado == null || this.listaMuestraResultado.Count == 0)
                {
                    sb.AppendLine("No ha generado Resultado de Muestras Especiales. ");
                    retorno = false;

                }
            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("frmBlendingRegistro:Validar", ex);
            }
            return retorno;
        }

        protected override void Guardar()
        {
            //base.Guardar();
            try
            {
                //Antes de validar recupero
                //Recupero los detalles
                RecuperarMuestra();
                this.listaMuestra = (List<listarBlendingMuestra_Result>)Session[SESSION_MUESTRA];

                //Entubacion
                this.listaMuestraResultado = (List<ListarBlendingResultado_Result>)Session[SESSION_RESULTADO];

                //Valido
                StringBuilder sb = new StringBuilder();
                if (!this.Validar(ref sb))
                {
                    this.MostrarMensajeValidacion(sb.ToString());
                    return;
                }

                GrupoMezcla grupoMezcla = new GrupoMezcla();
                grupoMezcla.CodigoGrupoMezcla = this.txtCodigo.Text;
                grupoMezcla.Anio = int.Parse(this.txtAnio.Text);
                grupoMezcla.Mes = this.ddlMes.SelectedValue;
                grupoMezcla.FechaInicioCabeceo = (DateTime)this.txtFechaInicioCabeceo.SelectedDate;
                grupoMezcla.FechaFinCabeceo = null;
                if (this.txtFechaInicioPlanta.SelectedDate != null) grupoMezcla.FechaInicioPlanta = (DateTime)this.txtFechaInicioPlanta.SelectedDate;
                if (this.txtFechaFinPlanta.SelectedDate != null) grupoMezcla.FechaFinPlanta = (DateTime)this.txtFechaFinPlanta.SelectedDate;

                grupoMezcla.Observacion = this.txtObservacion.Text;
                grupoMezcla.TotalMetrosProgramados = 0;
                grupoMezcla.TotalViajes = 0;
                grupoMezcla.TotalAg = 0;
                grupoMezcla.TotalPb = 0;
                grupoMezcla.TotalZn = 0;
                grupoMezcla.TotalCu = 0;
                grupoMezcla.CodigoTipoCancha = int.Parse(this.ddlTipoCancha.SelectedValue);
                grupoMezcla.FechaFinPlanta = null;

                List<GrupoMezclaResultado> listaDetalles = new List<GrupoMezclaResultado>();
                GrupoMezclaResultado detalle = null;

                if (this.listaMuestraResultado != null)
                {
                    if (this.listaMuestraResultado.Count > 0)
                    {
                        int totalProgramadas = this.listaMuestraResultado.Select(x => x.SubTotalMetrosProgramados).Sum();
                        int totalViajes = this.listaMuestraResultado.Select(x => x.SubTotalViajes).Sum();
                        double totalAg = this.listaMuestraResultado.Select(x => x.SubTotalAg).Sum();
                        double totalPb = this.listaMuestraResultado.Select(x => x.SubTotalPb).Sum();
                        double totalZn = this.listaMuestraResultado.Select(x => x.SubTotalZn).Sum();
                        double totalCu = this.listaMuestraResultado.Select(x => x.SubTotalCu).Sum();

                        grupoMezcla.TotalMetrosProgramados = totalProgramadas;
                        grupoMezcla.TotalViajes = totalViajes;
                        grupoMezcla.TotalAg = totalAg;
                        grupoMezcla.TotalPb = totalPb;
                        grupoMezcla.TotalZn = totalZn;
                        grupoMezcla.TotalCu = totalCu;
                    }

                    foreach (var item in this.listaMuestraResultado)
                    {
                        detalle = new GrupoMezclaResultado();
                        detalle.CodigoGrupoMezcla = grupoMezcla.CodigoGrupoMezcla;
                        detalle.CodigoPlataforma = item.CodigoPlataforma;
                        detalle.SubTotalMetrosProgramados = item.SubTotalMetrosProgramados;
                        detalle.SubTotalViajes = item.SubTotalViajes;
                        detalle.SubTotalAg = item.SubTotalAg;
                        detalle.SubTotalPb = item.SubTotalPb;
                        detalle.SubTotalZn = item.SubTotalZn;
                        detalle.SubTotalCu = item.SubTotalCu;

                        //Lista de avances diarios por sondaje
                        listaDetalles.Add(detalle);
                    }
                }
                grupoMezcla.GrupoMezclaResultado = listaDetalles.ToArray();

                List<MuestraEspecialRequest> muestrasEspeciales = new List<MuestraEspecialRequest>();
                foreach (var item in this.listaMuestra)
                {
                    MuestraEspecialRequest muestra = new MuestraEspecialRequest();
                    muestra.CodigoMuestraEspecial = item.CodigoMuestraEspecial;
                    muestra.CodigoPlataforma = (short)item.CodigoPlataforma;
                    muestrasEspeciales.Add(muestra);
                }

                //Graba
                using (var proxy = new SEGrupoMezclaClient("BasicHttpBinding_ISEGrupoMezcla"))
                {
                    if (this.hidCodigo.Value.CompareTo("0") == 0)

                        proxy.InsertarGrupoMezcla(grupoMezcla, muestrasEspeciales.ToArray());

                    else

                        proxy.ModificarGrupoMezcla(grupoMezcla, muestrasEspeciales.ToArray());
                }

                LimpiarDetalles();
                Response.Redirect("frmBlending.aspx", false);
            }
            catch (Exception ex)
            {
                MostrarMensajeValidacion(MSG_ERROR_GRABAR);
                Logger.Error("frmBlendingRegistro:Guardar", ex);
            }
        }
        #endregion

        #region Eventos

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {

        }

        protected void ibtnRegistrar_Click(object sender, ImageClickEventArgs e)
        {
            MostrarDetalle("0", enmAccionRealizar.Nuevo);
        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            Guardar();
        }

        #endregion

        private void RecuperarMuestra()
        {
            try
            {
                int pos = 1;
                List<listarBlendingMuestra_Result> lista = new List<listarBlendingMuestra_Result>();
                foreach (GridDataItem item in this.rgMuestra.Items)
                {

                    listarBlendingMuestra_Result detalle = null;
                    if (item.ItemType == GridItemType.AlternatingItem || item.ItemType == GridItemType.Item)
                    {
                        detalle = new listarBlendingMuestra_Result();

                        DropDownList ddlPlataforma = (DropDownList)item.FindControl("ddlPlataforma");
                        detalle.CodigoMuestraEspecial = item.GetDataKeyValue("CodigoMuestraEspecial").ToString();
                        detalle.FechaMuestra = DateTime.Parse(item.GetDataKeyValue("FechaMuestra").ToString());
                        detalle.ValorAg = double.Parse(item.GetDataKeyValue("ValorAg").ToString());
                        detalle.ValorPb = double.Parse(item.GetDataKeyValue("ValorPb").ToString());
                        detalle.ValorZn = double.Parse(item.GetDataKeyValue("ValorZn").ToString());
                        detalle.ValorCu = double.Parse(item.GetDataKeyValue("ValorCu").ToString());
                        detalle.DescripcionTipoCancha = item.GetDataKeyValue("DescripcionTipoCancha").ToString();
                        detalle.DescripcionPrograma = ddlPlataforma.SelectedItem.Text;
                        detalle.CodigoPlataforma = short.Parse(ddlPlataforma.SelectedValue);
                        detalle.NumeroViajes = int.Parse(item.GetDataKeyValue("NumeroViajes").ToString());
                        detalle.Observacion = item.GetDataKeyValue("Observacion").ToString();

                        // CodigoMuestraEspecial,FechaMuestra,ValorAg,ValorPb,ValorZn,ValorCu,DescripcionTipoCancha,DescripcionPrograma,NumeroViajes,Observacion
                        lista.Add(detalle);
                        pos++;
                    }

                    Session[SESSION_MUESTRA] = lista;
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:RecuperarMuestra", ex);
            }

        }

        protected void ddlMes_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.txtCodigo.Text = GenerarCodigoGrupoMuesta();
        }

        protected void ibtnAgregar_Click(object sender, ImageClickEventArgs e)
        {
            OcultarMensaje();
            this.txtCancha.Text = this.ddlTipoCancha.SelectedItem.Text;
            this.txtCodigoMuestraEspecial.Text = string.Empty;
            ConsultaMuestra();
            this.mpConsulta.Show();
            this.txtCodigoMuestraEspecial.Focus();
        }

        protected void ibtnBuscar_Click(object sender, ImageClickEventArgs e)
        {
            ConsultaMuestra();
        }

        private void AgregarMuestra()
        {
            try
            {
                if (this.rgConsulta.Items.Count == 0)
                {
                    return;
                }

                int pos = 1;
                this.listaMuestra = (List<listarBlendingMuestra_Result>)Session[SESSION_MUESTRA];
                foreach (GridDataItem item in this.rgConsulta.Items)
                {
                    listarBlendingMuestra_Result detalle = null;
                    if (item.ItemType == GridItemType.AlternatingItem || item.ItemType == GridItemType.Item)
                    {
                        CheckBox chkSel = (CheckBox)item.FindControl("chkSel");
                        if (chkSel.Checked)
                        {
                            string codigoMuestraEspecial = item.GetDataKeyValue("CodigoMuestraEspecial").ToString();

                            var existe = this.listaMuestra.Where(x => x.CodigoMuestraEspecial == codigoMuestraEspecial).FirstOrDefault();
                            if (existe == null)
                            {
                                detalle = new listarBlendingMuestra_Result();

                                detalle.CodigoMuestraEspecial = codigoMuestraEspecial;
                                detalle.FechaMuestra = DateTime.Parse(item.GetDataKeyValue("FechaMuestra").ToString());
                                detalle.ValorAg = double.Parse(item.GetDataKeyValue("ValorAg").ToString());
                                detalle.ValorPb = double.Parse(item.GetDataKeyValue("ValorPb").ToString());
                                detalle.ValorZn = double.Parse(item.GetDataKeyValue("ValorZn").ToString());
                                detalle.ValorCu = double.Parse(item.GetDataKeyValue("ValorCu").ToString());
                                detalle.DescripcionTipoCancha = item.GetDataKeyValue("DescripcionTipoCancha").ToString();
                                detalle.CodigoPlataforma = short.Parse(item.GetDataKeyValue("CodigoPlataforma").ToString());
                                detalle.DescripcionPrograma = item.GetDataKeyValue("DescripcionPrograma").ToString();
                                detalle.NumeroViajes = int.Parse(item.GetDataKeyValue("NumeroViajes").ToString());
                                detalle.Observacion = item.GetDataKeyValue("Observacion").ToString();

                                // CodigoMuestraEspecial,FechaMuestra,ValorAg,ValorPb,ValorZn,ValorCu,DescripcionTipoCancha,DescripcionPrograma,NumeroViajes,Observacion
                                this.listaMuestra.Add(detalle);
                                pos++;
                            }
                        }
                    }
                }

                this.rgMuestra.DataSource = this.listaMuestra;
                this.rgMuestra.DataBind();
                Session[SESSION_MUESTRA] = this.listaMuestra;

                this.ddlTipoCancha.CssClass = CSS_INPUT_DISABLED;
                this.ddlTipoCancha.Enabled = false;
                this.mpConsulta.Hide();

            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:AgregarMuestra", ex);
            }

        }

        protected void ibtnCancelarConsulta_Click(object sender, ImageClickEventArgs e)
        {
            this.mpConsulta.Hide();
        }

        protected void ibtnGuardarConsulta_Click(object sender, ImageClickEventArgs e)
        {
            AgregarMuestra();
        }

        protected void rgMuestra_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    DropDownList ddlPlataforma = (DropDownList)item.FindControl("ddlPlataforma");
                    listaPlataforma = (List<ListItemInt>)Session[SESSION_PLATAFORMA];

                    Bind(ddlPlataforma, listaPlataforma);
                    ddlPlataforma.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    ddlPlataforma.SelectedValue = ((GridDataItem)e.Item).GetDataKeyValue("CodigoPlataforma").ToString();
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:rgMuestra_ItemDataBound", ex);
            }
        }

        protected void rgMuestra_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                OcultarMensajeValidacion();
                string CodigoMuestraEspecial = ((GridDataItem)e.Item).GetDataKeyValue("CodigoMuestraEspecial").ToString();

                RecuperarMuestra();
                this.listaMuestra = (List<listarBlendingMuestra_Result>)Session[SESSION_MUESTRA];

                foreach (var item in this.listaMuestra)
                {
                    if (item.CodigoMuestraEspecial.CompareTo(CodigoMuestraEspecial) == 0)
                    {
                        this.listaMuestra.Remove(item);
                        break;
                    }
                }

                Session[SESSION_MUESTRA] = this.listaMuestra;
                this.rgMuestra.DataSource = this.listaMuestra;
                this.rgMuestra.DataBind();

                //Habilito Tipo de Cancha si esta en modo de Edicion
                if (this.listaMuestra.Count == 0 && this.hidAccion.Value.CompareTo(enmAccionRealizar.Nuevo.GetHashCode().ToString()) == 0)
                {
                    this.ddlTipoCancha.Enabled = true;
                    this.ddlTipoCancha.CssClass = string.Empty;
                }

                this.listaMuestraResultado = (List<ListarBlendingResultado_Result>)Session[SESSION_RESULTADO];
                this.listaMuestraResultado.Clear();

                Session[SESSION_RESULTADO] = this.listaMuestraResultado;
                this.rgResultado.DataSource = this.listaMuestraResultado;
                this.rgResultado.DataBind();
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:rgMuestra_DeleteCommand", ex);
            }
        }

        protected void ibtnGenerar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                OcultarMensajeValidacion();
                RecuperarMuestra();
                this.listaMuestra = (List<listarBlendingMuestra_Result>)Session[SESSION_MUESTRA];

                //Obtengo la lista
                this.listaMuestraResultado = listaMuestra.Select(x => new ListarBlendingResultado_Result
                {
                    CodigoPlataforma = (short)x.CodigoPlataforma,
                    DescripcionPlataforma = x.DescripcionPrograma,
                    SubTotalMetrosProgramados = 0,
                    SubTotalViajes = (int)x.NumeroViajes,
                    SubTotalAg = (double)x.ValorAg,
                    SubTotalPb = (double)x.ValorPb,
                    SubTotalZn = (double)x.ValorZn,
                    SubTotalCu = (double)x.ValorZn
                }).ToList();

                //Agrupo la muestra por Plataforma
                List<short> codigosPlataforma = listaMuestraResultado.Select(x => x.CodigoPlataforma).Distinct().ToList();


                foreach (var item in codigosPlataforma)
                {
                    var programas = listaMuestraResultado.Where(x => x.CodigoPlataforma == item).ToList();
                    foreach (var detalle in programas)
                    {

                    }
                }

                var result = from plataforma in listaMuestraResultado
                             group plataforma by plataforma.CodigoPlataforma
                                 into resumen
                                 select new
                                 {
                                     resumen.Key,
                                     CodigoPlataforma = resumen.FirstOrDefault().CodigoPlataforma,
                                     DescripcionPlataforma = resumen.FirstOrDefault().DescripcionPlataforma,
                                     SubTotalMetrosProgramados = resumen.Sum(x => x.SubTotalViajes) * 18,
                                     SubTotalViajes = resumen.Sum(x => x.SubTotalViajes),
                                     SubTotalAg = resumen.Sum(x => x.SubTotalAg) * resumen.Sum(x => x.SubTotalViajes) / resumen.Sum(x => x.SubTotalViajes),
                                     SubTotalPb = resumen.Sum(x => x.SubTotalPb) * resumen.Sum(x => x.SubTotalViajes) / resumen.Sum(x => x.SubTotalViajes),
                                     SubTotalZn = resumen.Sum(x => x.SubTotalZn) * resumen.Sum(x => x.SubTotalViajes) / resumen.Sum(x => x.SubTotalViajes),
                                     SubTotalCu = resumen.Sum(x => x.SubTotalCu) * resumen.Sum(x => x.SubTotalViajes) / resumen.Sum(x => x.SubTotalViajes),
                                 };

                List<ListarBlendingResultado_Result> resultado = result.ToList().Select(x => new ListarBlendingResultado_Result
                {
                    CodigoPlataforma = x.CodigoPlataforma,
                    DescripcionPlataforma = x.DescripcionPlataforma,
                    SubTotalMetrosProgramados = x.SubTotalMetrosProgramados,
                    SubTotalViajes = x.SubTotalViajes,
                    SubTotalAg = Math.Round(x.SubTotalAg, 2),
                    SubTotalPb = Math.Round(x.SubTotalPb, 2),
                    SubTotalZn = Math.Round(x.SubTotalZn, 2),
                    SubTotalCu = Math.Round(x.SubTotalCu, 2)
                }).ToList();

                this.listaMuestraResultado = resultado;
                Session[SESSION_RESULTADO] = this.listaMuestraResultado;
                this.rgResultado.DataSource = resultado;
                this.rgResultado.DataBind();

            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:ibtnGenerar_Click", ex);
            }
        }

        private void LimpiarResultado()
        {
            this.hidCodigoPlataforma.Value = "0";
            this.ddlPlataforma.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.txtTonaladas.Text = string.Empty;
            this.txtViajes.Text = string.Empty;
            this.txtTAg.Text = string.Empty;
            this.txtTPb.Text = string.Empty;
            this.txtTZn.Text = string.Empty;
            this.txtTCu.Text = string.Empty;
            this.ddlPlataforma.Enabled = true;
            this.ddlPlataforma.CssClass = string.Empty;
        }

        protected void ibtnAgregarResultado_Click(object sender, ImageClickEventArgs e)
        {
            LimpiarResultado();
            OcultarMensajeValidacion();
            OcultarMensajeValidacionResultado();
            this.mpRegistro.Show();
        }

        protected void rgResultado_ItemCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.CompareTo("Editar") == 0)
                {
                    var item = (GridEditableItem)e.Item;
                    int codigoPlataforma = int.Parse(item.GetDataKeyValue("CodigoPlataforma").ToString());
                    this.listaMuestraResultado = (List<ListarBlendingResultado_Result>)Session[SESSION_RESULTADO];

                    var plataforma = this.listaMuestraResultado.Where(x => x.CodigoPlataforma == codigoPlataforma).FirstOrDefault();
                    if (plataforma != null)
                    {

                        this.hidCodigoPlataforma.Value = plataforma.CodigoPlataforma.ToString();
                        this.ddlPlataforma.SelectedValue = plataforma.CodigoPlataforma.ToString();
                        this.txtTonaladas.Text = plataforma.SubTotalMetrosProgramados.ToString();
                        this.txtViajes.Text = plataforma.SubTotalViajes.ToString();
                        this.txtTAg.Text = plataforma.SubTotalAg.ToString();
                        this.txtTPb.Text = plataforma.SubTotalPb.ToString();
                        this.txtTZn.Text = plataforma.SubTotalZn.ToString();
                        this.txtTCu.Text = plataforma.SubTotalCu.ToString();
                        this.ddlPlataforma.Enabled = false;
                        this.ddlPlataforma.CssClass = CSS_INPUT_DISABLED;

                        OcultarMensajeValidacionResultado();
                        OcultarMensajeValidacion();

                        this.mpRegistro.Show();
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:rgResultado_ItemCommand", ex);
            }
        }

        protected void ibtnCancelarRegistro_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void ibtnGuardarRegistro_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                this.listaMuestraResultado = (List<ListarBlendingResultado_Result>)Session[SESSION_RESULTADO];
                if (this.listaMuestraResultado == null) this.listaMuestraResultado = new List<ListarBlendingResultado_Result>();

                short codigoPlataforma = short.Parse(this.ddlPlataforma.SelectedValue);

                if (this.hidCodigoPlataforma.Value.CompareTo("0") == 0)
                {
                    var existe = this.listaMuestraResultado.Where(x => x.CodigoPlataforma.Equals(codigoPlataforma)).FirstOrDefault();
                    if (existe != null)
                    {
                        MostrarMensajeValidacionResultado("Plataforma seleccionado está registrado");
                        return;
                    }

                    ListarBlendingResultado_Result item = new ListarBlendingResultado_Result();
                    item.CodigoPlataforma = short.Parse(this.ddlPlataforma.SelectedValue);
                    item.DescripcionPlataforma = this.ddlPlataforma.SelectedItem.Text;
                    item.SubTotalMetrosProgramados = int.Parse(this.txtTonaladas.Text);
                    item.SubTotalViajes = int.Parse(this.txtViajes.Text);
                    item.SubTotalAg = double.Parse(this.txtTAg.Text);
                    item.SubTotalPb = double.Parse(this.txtTPb.Text);
                    item.SubTotalZn = double.Parse(this.txtTZn.Text);
                    item.SubTotalCu = double.Parse(this.txtTCu.Text);
                    this.listaMuestraResultado.Add(item);
                }
                else
                {
                    if (this.listaMuestraResultado.Count > 0)
                    {
                        var itemEdit = this.listaMuestraResultado.Where(x => x.CodigoPlataforma.Equals(codigoPlataforma)).FirstOrDefault();
                        if (itemEdit != null)
                        {
                            this.listaMuestraResultado.Where(x => x.CodigoPlataforma.CompareTo(codigoPlataforma) == 0).FirstOrDefault().SubTotalMetrosProgramados = int.Parse(this.txtTonaladas.Text);
                            this.listaMuestraResultado.Where(x => x.CodigoPlataforma.CompareTo(codigoPlataforma) == 0).FirstOrDefault().SubTotalViajes = int.Parse(this.txtViajes.Text);
                            this.listaMuestraResultado.Where(x => x.CodigoPlataforma.CompareTo(codigoPlataforma) == 0).FirstOrDefault().SubTotalAg = double.Parse(this.txtTAg.Text);
                            this.listaMuestraResultado.Where(x => x.CodigoPlataforma.CompareTo(codigoPlataforma) == 0).FirstOrDefault().SubTotalPb = double.Parse(this.txtTPb.Text);
                            this.listaMuestraResultado.Where(x => x.CodigoPlataforma.CompareTo(codigoPlataforma) == 0).FirstOrDefault().SubTotalZn = double.Parse(this.txtTZn.Text);
                            this.listaMuestraResultado.Where(x => x.CodigoPlataforma.CompareTo(codigoPlataforma) == 0).FirstOrDefault().SubTotalCu = double.Parse(this.txtTCu.Text);
                        }
                    }
                }

                Session[SESSION_RESULTADO] = this.listaMuestraResultado;
                this.rgResultado.DataSource = this.listaMuestraResultado;
                this.rgResultado.DataBind();
                this.mpRegistro.Hide();
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:ibtnGuardarRegistro_Click", ex);
            }
        }

        protected void rgResultado_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Footer)
                {
                    List<ListarBlendingResultado_Result> resumen = (List<ListarBlendingResultado_Result>)Session[SESSION_RESULTADO];
                    if (resumen != null && resumen.Count > 0)
                    {
                        int totalProgramadas = resumen.Select(x => x.SubTotalMetrosProgramados).Sum();
                        int totalViajes = resumen.Select(x => x.SubTotalViajes).Sum();
                        double totalAg = resumen.Select(x => x.SubTotalAg).Average();
                        double totalPb = resumen.Select(x => x.SubTotalPb).Average();
                        double totalZn = resumen.Select(x => x.SubTotalZn).Average();
                        double totalCu = resumen.Select(x => x.SubTotalCu).Average();

                        GridFooterItem fitem = (GridFooterItem)e.Item;
                        Label lblTProgra = (Label)fitem.FindControl("lblTProgra");
                        Label lblTViajes = (Label)fitem.FindControl("lblTViajes");
                        Label lblTAg = (Label)fitem.FindControl("lblTAg");
                        Label lblTPb = (Label)fitem.FindControl("lblTPb");
                        Label lblTZn = (Label)fitem.FindControl("lblTZn");
                        Label lblTCu = (Label)fitem.FindControl("lblTCu");

                        lblTProgra.Text = totalProgramadas.ToString();
                        lblTViajes.Text = totalViajes.ToString();
                        lblTAg.Text = totalAg.ToString();
                        lblTPb.Text = totalPb.ToString();
                        lblTZn.Text = totalZn.ToString();
                        lblTCu.Text = totalCu.ToString();
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmBlendingRegistro:rgResultado_ItemDataBound", ex);
            }
        }

        protected void rgConsulta_PageIndexChanged(object sender, GridPageChangedEventArgs e)
        {
            ConsultaMuestra();
        }

        protected void rgConsulta_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e)
        {
            ConsultaMuestra();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            LimpiarDetalles();
            Response.Redirect("frmBlending.aspx", false);
        }
    }
}
